[INFO] fetching crate opencode-voice 0.1.4...
[INFO] testing opencode-voice-0.1.4 against try#28f95933dc0727396c07b48d0a8cb5211b7fb472 for pr-154065-2
[INFO] extracting crate opencode-voice 0.1.4 into /workspace/builds/worker-4-tc2/source
[INFO] started tweaking crates.io crate opencode-voice 0.1.4
[INFO] removed 0 missing tests
[INFO] finished tweaking crates.io crate opencode-voice 0.1.4
[INFO] tweaked toml for crates.io crate opencode-voice 0.1.4 written to /workspace/builds/worker-4-tc2/source/Cargo.toml
[INFO] validating manifest of crates.io crate opencode-voice 0.1.4 on toolchain 28f95933dc0727396c07b48d0a8cb5211b7fb472
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate crates.io crate opencode-voice 0.1.4 already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-4-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10
[INFO] running `Command { std: "docker" "start" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10" "/opt/rustwide/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10" "/opt/rustwide/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "build" "--frozen" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling libc v0.2.183
[INFO] [stderr]    Compiling bitflags v2.11.0
[INFO] [stderr]    Compiling cc v1.2.56
[INFO] [stderr]    Compiling itoa v1.0.17
[INFO] [stderr]    Compiling linux-raw-sys v0.4.15
[INFO] [stderr]    Compiling clang-sys v1.8.1
[INFO] [stderr]    Compiling prettyplease v0.2.37
[INFO] [stderr]    Compiling rustix v0.38.44
[INFO] [stderr]    Compiling regex-syntax v0.8.10
[INFO] [stderr]    Compiling minimal-lexical v0.2.1
[INFO] [stderr]    Compiling either v1.15.0
[INFO] [stderr]    Compiling writeable v0.6.2
[INFO] [stderr]    Compiling zerovec-derive v0.11.2
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling yoke-derive v0.8.1
[INFO] [stderr]    Compiling tokio-macros v2.6.1
[INFO] [stderr]    Compiling http v1.4.0
[INFO] [stderr]    Compiling litemap v0.8.1
[INFO] [stderr]    Compiling libloading v0.8.9
[INFO] [stderr]    Compiling nom v7.1.3
[INFO] [stderr]    Compiling bindgen v0.69.5
[INFO] [stderr]    Compiling icu_properties_data v2.1.2
[INFO] [stderr]    Compiling home v0.5.12
[INFO] [stderr]    Compiling icu_normalizer_data v2.1.1
[INFO] [stderr]    Compiling itertools v0.12.1
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]    Compiling lazy_static v1.5.0
[INFO] [stderr]    Compiling rustc-hash v1.1.0
[INFO] [stderr]    Compiling openssl v0.10.75
[INFO] [stderr]    Compiling lazycell v1.3.0
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling openssl-macros v0.1.1
[INFO] [stderr]    Compiling memoffset v0.6.5
[INFO] [stderr]    Compiling alsa-sys v0.3.1
[INFO] [stderr]    Compiling signal-hook v0.3.18
[INFO] [stderr]    Compiling http-body v1.0.1
[INFO] [stderr]    Compiling radium v0.7.0
[INFO] [stderr]    Compiling anstyle-parse v0.2.7
[INFO] [stderr]    Compiling tracing v0.1.44
[INFO] [stderr]    Compiling getrandom v0.4.2
[INFO] [stderr]    Compiling zerofrom v0.1.6
[INFO] [stderr]    Compiling indexmap v2.13.0
[INFO] [stderr]    Compiling colorchoice v1.0.4
[INFO] [stderr]    Compiling portable-atomic v1.13.1
[INFO] [stderr]    Compiling yoke v0.8.1
[INFO] [stderr]    Compiling tap v1.0.1
[INFO] [stderr]    Compiling anstyle v1.0.13
[INFO] [stderr]    Compiling wyz v0.5.1
[INFO] [stderr]    Compiling zerovec v0.11.5
[INFO] [stderr]    Compiling zerotrie v0.2.3
[INFO] [stderr]    Compiling cmake v0.1.57
[INFO] [stderr]    Compiling anstream v0.6.21
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]    Compiling http-body-util v0.1.3
[INFO] [stderr]    Compiling which v4.4.2
[INFO] [stderr]    Compiling iri-string v0.7.10
[INFO] [stderr]    Compiling regex-automata v0.4.14
[INFO] [stderr]    Compiling errno v0.3.14
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling signal-hook-registry v1.4.8
[INFO] [stderr]    Compiling mio v1.1.1
[INFO] [stderr]    Compiling socket2 v0.6.3
[INFO] [stderr]    Compiling tinystr v0.8.2
[INFO] [stderr]    Compiling potential_utf v0.1.4
[INFO] [stderr]    Compiling parking_lot v0.12.5
[INFO] [stderr]    Compiling openssl-sys v0.9.111
[INFO] [stderr]    Compiling icu_collections v2.1.1
[INFO] [stderr]    Compiling icu_locale_core v2.1.1
[INFO] [stderr]    Compiling zeroize v1.8.2
[INFO] [stderr]    Compiling tokio v1.50.0
[INFO] [stderr]    Compiling cexpr v0.6.0
[INFO] [stderr]    Compiling native-tls v0.2.18
[INFO] [stderr]    Compiling cpal v0.15.3
[INFO] [stderr]    Compiling whisper-rs v0.13.2
[INFO] [stderr]    Compiling option-ext v0.2.0
[INFO] [stderr]    Compiling clap_lex v1.0.0
[INFO] [stderr]    Compiling funty v2.0.0
[INFO] [stderr]    Compiling serde_urlencoded v0.7.1
[INFO] [stderr]    Compiling alsa v0.9.1
[INFO] [stderr]    Compiling clap_builder v4.5.60
[INFO] [stderr]    Compiling dirs-sys v0.5.0
[INFO] [stderr]    Compiling clap_derive v4.5.55
[INFO] [stderr]    Compiling console v0.15.11
[INFO] [stderr]    Compiling rustls-pki-types v1.14.0
[INFO] [stderr]    Compiling icu_provider v2.1.1
[INFO] [stderr]    Compiling bitvec v1.0.1
[INFO] [stderr]    Compiling signal-hook-mio v0.2.5
[INFO] [stderr]    Compiling icu_properties v2.1.2
[INFO] [stderr]    Compiling regex v1.12.3
[INFO] [stderr]    Compiling icu_normalizer v2.1.1
[INFO] [stderr]    Compiling nix v0.23.2
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]    Compiling futures-executor v0.3.32
[INFO] [stderr]    Compiling encoding_rs v0.8.35
[INFO] [stderr]    Compiling dasp_sample v0.11.0
[INFO] [stderr]    Compiling number_prefix v0.4.0
[INFO] [stderr]    Compiling idna_adapter v1.2.1
[INFO] [stderr]    Compiling indicatif v0.17.11
[INFO] [stderr]    Compiling idna v1.1.0
[INFO] [stderr]    Compiling futures v0.3.32
[INFO] [stderr]    Compiling uuid v1.22.0
[INFO] [stderr]    Compiling dirs v6.0.0
[INFO] [stderr]    Compiling url v2.5.8
[INFO] [stderr]    Compiling crossterm v0.28.1
[INFO] [stderr]    Compiling hound v3.5.1
[INFO] [stderr]    Compiling clap v4.5.60
[INFO] [stderr]    Compiling tokio-util v0.7.18
[INFO] [stderr]    Compiling tower v0.5.3
[INFO] [stderr]    Compiling evdev v0.12.2
[INFO] [stderr]    Compiling tokio-native-tls v0.3.1
[INFO] [stderr]    Compiling tower-http v0.6.8
[INFO] [stderr]    Compiling h2 v0.4.13
[INFO] [stderr]    Compiling whisper-rs-sys v0.11.1
[INFO] [stderr]    Compiling hyper v1.8.1
[INFO] [stderr]    Compiling hyper-util v0.1.20
[INFO] [stderr]    Compiling hyper-tls v0.6.0
[INFO] [stderr]    Compiling reqwest v0.12.28
[INFO] [stderr]    Compiling opencode-voice v0.1.4 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 36s
[INFO] running `Command { std: "docker" "inspect" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10" "/opt/rustwide/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "test" "--frozen" "--no-run" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling opencode-voice v0.1.4 (/opt/rustwide/workdir)
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 6.68s
[INFO] running `Command { std: "docker" "inspect" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-w" "/opt/rustwide/workdir" "--user" "0:0" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10" "/opt/rustwide/cargo-home/bin/cargo" "+28f95933dc0727396c07b48d0a8cb5211b7fb472" "test" "--frozen", kill_on_drop: false }`
[INFO] [stderr]     Finished `test` profile [unoptimized + debuginfo] target(s) in 0.41s
[INFO] [stderr]      Running unittests src/lib.rs (/opt/rustwide/target/debug/deps/opencode_voice-1bd1a9b9fb0c5a7c)
[INFO] [stdout] 
[INFO] [stdout] running 253 tests
[INFO] [stdout] [35m? Question pending[0mtest app::approval::tests::test_question_asked_transitions_to_approval_pending ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session became busy — clearing pending approvals (answered externally).
[INFO] [stdout] [31m● REC 0.0s[0mtest app::approval::tests::test_session_busy_does_not_change_recording_state ... ok
[INFO] [stdout] test app::approval::tests::test_session_busy_no_op_without_pending ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session idle — clearing stale approvals.
[INFO] [stdout] [33m⠋ Transcribing...[0m[35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_idle_does_not_change_transcribing_state ... ok
[INFO] [stdout] test app::approval::tests::test_question_replied_removes_from_queue ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m⚠ Approval needed (+1 more): bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_idle_no_op_without_pending ... ok
[INFO] [stdout] test app::recording::tests::test_handle_push_to_talk_start_ignores_recording ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/rejecttest app::recording::tests::test_handle_push_to_talk_start_ignores_transcribing ... ok
[INFO] [stdout] test app::approval::tests::test_multiple_approvals_stay_pending_until_all_cleared ... ok
[INFO] [stdout] test app::approval::tests::test_permission_asked_transitions_to_approval_pending ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_permission_replied_removes_from_queue_and_returns_to_idle ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session idle — clearing stale approvals.
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0m[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_idle_clears_stale_approvals ... ok
[INFO] [stdout] test app::recording::tests::test_handle_push_to_talk_stop_no_recorder_returns_to_idle ... ok
[INFO] [stdout] test app::recording::tests::test_handle_push_to_talk_stop_ignores_idle ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m⚠ Approval needed (+1 more): bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session became busy — clearing pending approvals (answered externally).
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_busy_clears_pending_approvals ... ok
[INFO] [stdout] [35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_question_rejected_removes_from_queue ... ok
[INFO] [stdout] [31m● REC 0.0s[0mtest app::recording::tests::test_handle_toggle_ignores_transcribing_state ... ok
[INFO] [stdout] test app::recording::tests::test_handle_toggle_approval_pending_to_recording ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_initializes_idle_state ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_question_no_match_returns_false ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_not_shutting_down ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_permission_no_match_returns_false ... ok
[INFO] [stdout] [31m● REC 0.0s[0mtest app::recording::tests::test_handle_toggle_idle_to_recording ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_all_patterns ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_allow_all ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_always ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_always_allow ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_takes_priority_over_once ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_trust ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_trust_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_empty ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_random_text ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_whitespace_only ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_extra_whitespace ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_internal_punctuation_preserved ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_mixed_case ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_multiple_trailing_punctuation ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_punctuation ... ok
[INFO] [stdout] test approval::matcher::tests::test_not_allowed_exact_reject ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_accept ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_all_patterns ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_once ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_this ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_once ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_this ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_do_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_execute ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_go_ahead ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_go_for_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_ok ... ok
[INFO] [stdout] [31m✗ Error: Failed to reply to permission: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1A[1G[J[31m✗ Error: Failed to reply to permission: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...test app::recording::tests::test_try_handle_approval_permission_match_removes_item_and_returns_true ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_permit ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_proceed ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_okay ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_empty_queue_returns_false ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_with_punctuation ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_sure ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_run_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yeah ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yep ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yes ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_custom_answer ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_custom_answer_preserves_text ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_empty_questions_no_match ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_exact_label ... ok
[INFO] [stdout] [31m✗ Error: test error[0m
[INFO] [stdout]   Recovering...test approval::matcher::tests::test_question_exact_label_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_label_in_text ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_no_match_no_custom ... ok
[INFO] [stdout] test app::tests::test_handle_error_sets_error_state ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_1 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_2 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_3 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_out_of_range_no_custom ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_out_of_range_with_custom ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_first ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_one ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_second ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_two ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_cancel ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_dismiss ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_nevermind ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_never_mind ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_none ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_skip ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_all_patterns ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_block ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_decline ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_cancel ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_deny ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dont_do_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dismiss ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_do_not ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dont ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_no ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_nah ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_reject ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_skip ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_nope ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_cancel_prefix ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_deny_prefix ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_no_space_separator ... ok
[INFO] [stdout] test approval::queue::tests::test_add_permission_and_peek ... ok
[INFO] [stdout] test approval::queue::tests::test_add_question_and_peek ... ok
[INFO] [stdout] test approval::queue::tests::test_clear_empties_queue ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_refuse ... ok
[INFO] [stdout] test approval::queue::tests::test_clear_on_empty_queue ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_stop ... ok
[INFO] [stdout] test approval::queue::tests::test_default_creates_empty_queue ... ok
[INFO] [stdout] test approval::queue::tests::test_fifo_ordering ... ok
[INFO] [stdout] test approval::queue::tests::test_insertion_order_preserved ... ok
[INFO] [stdout] test approval::queue::tests::test_len_increments_correctly ... ok
[INFO] [stdout] test approval::queue::tests::test_mixed_permission_and_question_types ... ok
[INFO] [stdout] test approval::queue::tests::test_new_queue_is_empty ... ok
[INFO] [stdout] test approval::queue::tests::test_clear_then_reuse ... ok
[INFO] [stdout] test approval::queue::tests::test_peek_does_not_remove ... ok
[INFO] [stdout] test approval::queue::tests::test_has_pending_tracks_state ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_found ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_not_found ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_last_item_leaves_empty ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_not_found_does_not_change_len ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_preserves_fifo_order ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message ... ok
[INFO] [stdout] test audio::wav::tests::test_create_temp_wav_path_in_temp_dir ... ok
[INFO] [stdout] test audio::wav::tests::test_drop_no_panic_when_file_missing ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_middle_item ... ok
[INFO] [stdout] test audio::wav::tests::test_write_wav_creates_valid_file ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_connected ... ok
[INFO] [stdout] test bridge::events::tests::test_backoff_calculation ... ok
[INFO] [stdout] test audio::wav::tests::test_create_temp_wav_path_has_uuid ... ok
[INFO] [stdout] test audio::wav::tests::test_write_and_delete ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_empty_data ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_message_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_malformed_json ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_heartbeat_ignored ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_misc_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_no_type_field ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_permission_asked ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_missing_properties ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_session_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_rejected ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_busy ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_asked ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_permission_replied ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_retry ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_snake_case_session_id ... ok
[INFO] [stdout] [31m✗ Error: Failed to reject question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1A[1G[J[31m✗ Error: Failed to reject question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...test bridge::events::tests::test_parse_truly_unknown_event_returns_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_missing_status_field ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_idle ... ok
[INFO] [stdout] test config::tests::test_app_config_default_field_values ... ok
[INFO] [stdout] test config::tests::test_app_config_opencode_port ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_contains_app_name ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_question_reject_removes_item_and_returns_true ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_ends_with_opencode_voice ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_unknown_type ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_replied ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_is_absolute ... ok
[INFO] [stdout] test config::tests::test_model_size_display_base_en ... ok
[INFO] [stdout] test config::tests::test_model_size_display_tiny_en ... ok
[INFO] [stdout] test config::tests::test_model_size_from_str ... ok
[INFO] [stdout] test config::tests::test_model_size_default ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_base ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_tiny ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_small ... ok
[INFO] [stdout] test config::tests::test_model_size_from_str_invalid ... ok
[INFO] [stdout] test config::tests::test_model_size_display_small_en ... ok
[INFO] [stdout] test config::tests::test_model_size_display ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_short_aliases_are_multilingual ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_unknown_returns_error ... ok
[INFO] [stdout] test config::tests::test_model_size_is_multilingual ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_key_map_has_60_plus_entries ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_caps_lock ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_escape ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_alias_right_alt ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_decimal_number ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_f1 ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_f13 ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_hex_number ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_numpad ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_modifiers ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_right_option ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_left_command ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_unknown ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_f13 ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_numpad_enter ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_right_option ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_space ... ok
[INFO] [stdout] test input::hotkey::tests::test_key_map_has_60_plus_entries ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_includes_numpad_clear ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_includes_section ... ok
[INFO] [stdout] test transcribe::engine::tests::test_is_model_valid_small_file ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_space ... ok
[INFO] [stdout] test transcribe::engine::tests::test_is_model_valid_nonexistent ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_case_insensitive ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_mixed ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_preserves_real_text ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_sorted ... ok
[INFO] [stdout] test transcribe::setup::tests::test_get_model_path ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_no_timestamps ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_preserves_non_timestamp_brackets ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_missing_file ... ok
[INFO] [stdout] test transcribe::setup::tests::test_get_model_path_contains_model_size ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_valid_file ... ok
[INFO] [stdout] test ui::display::tests::test_all_states_produce_output ... ok
[INFO] [stdout] test ui::display::tests::test_display_default ... ok
[INFO] [stdout] test ui::display::tests::test_display_new_initial_state ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_bash ... ok
[INFO] [stdout] test ui::display::tests::test_all_states_produce_distinct_output ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_empty_metadata ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_read ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_unknown_fallback ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_write ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_clamps_above_one ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_empty ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_full ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_half ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_width_zero ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_edit ... ok
[INFO] [stdout] test app::tests::test_voice_app_event_channel_works ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_multiple_count ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_no_approval ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_permission ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_question ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_question_empty ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_error ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_blank_audio ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_error_default_message ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_no_transcript ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_transcript_truncated ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_with_transcript ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_injecting ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_recording ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_recording_no_level ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_transcribing ... ok
[INFO] [stdout] [31m✗ Error: Failed to reply to question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1A[1G[J[31m✗ Error: Failed to reply to question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...test app::recording::tests::test_try_handle_approval_question_match_removes_item_and_returns_true ... ok
[INFO] [stdout] test app::tests::test_voice_app_shutdown_sets_flag ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/rejecttest app::recording::tests::test_return_to_approval_pending_when_queue_has_items ... ok
[INFO] [stdout] [33m⠋ Transcribing...[0mtest app::recording::tests::test_handle_toggle_recording_to_transcribing ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_with_arrow ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_small_file ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_approval_queue_empty ... ok
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0mtest app::recording::tests::test_return_to_idle_when_no_pending ... ok
[INFO] [stdout] test app::tests::test_voice_app_shutdown_cancels_token ... ok
[INFO] [stdout] test app::tests::test_recover_from_error_transitions_to_idle ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_whisper_none_when_model_missing ... ok
[INFO] [stdout] test app::tests::test_voice_app_shutdown_idempotent ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 253 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.89s
[INFO] [stdout] 
[INFO] [stderr]      Running unittests src/main.rs (/opt/rustwide/target/debug/deps/opencode_voice-b24e23cdf44a80c8)
[INFO] [stdout] 
[INFO] [stdout] running 258 tests
[INFO] [stdout] test app::approval::tests::test_session_busy_no_op_without_pending ... ok
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0m[35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session became busy — clearing pending approvals (answered externally).
[INFO] [stdout] [31m● REC 0.0s[0mtest app::recording::tests::test_handle_push_to_talk_stop_no_recorder_returns_to_idle ... ok
[INFO] [stdout] test app::approval::tests::test_session_busy_does_not_change_recording_state ... ok
[INFO] [stdout] test app::recording::tests::test_handle_push_to_talk_start_ignores_transcribing ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/rejecttest app::approval::tests::test_permission_asked_transitions_to_approval_pending ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session idle — clearing stale approvals.
[INFO] [stdout] [33m⠋ Transcribing...[0mtest app::recording::tests::test_handle_push_to_talk_stop_ignores_idle ... ok
[INFO] [stdout] test app::approval::tests::test_session_idle_does_not_change_transcribing_state ... ok
[INFO] [stdout] test app::approval::tests::test_session_idle_no_op_without_pending ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m⚠ Approval needed (+1 more): bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[voice] Session became busy — clearing pending approvals (answered externally).
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0m[35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m⚠ Approval needed (+1 more): bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_busy_clears_pending_approvals ... ok
[INFO] [stdout] test app::approval::tests::test_multiple_approvals_stay_pending_until_all_cleared ... ok
[INFO] [stdout] [35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_question_replied_removes_from_queue ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1A[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_permission_replied_removes_from_queue_and_returns_to_idle ... ok
[INFO] [stdout] [35m? Question pending[0m[1G[J[32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_question_rejected_removes_from_queue ... ok
[INFO] [stdout] [35m? Question pending[0m[35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/reject[1Atest app::approval::tests::test_question_asked_transitions_to_approval_pending ... [ok
[INFO] [stdout] 1G[J[voice] Session idle — clearing stale approvals.
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0mtest app::approval::tests::test_session_idle_clears_stale_approvals ... ok
[INFO] [stdout] test app::recording::tests::test_handle_push_to_talk_start_ignores_recording ... ok
[INFO] [stdout] [31m● REC 0.0s[0mtest app::recording::tests::test_handle_toggle_approval_pending_to_recording ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_permission_no_match_returns_false ... ok
[INFO] [stdout] [31m● REC 0.0s[0mtest app::recording::tests::test_handle_toggle_idle_to_recording ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_question_no_match_returns_false ... ok
[INFO] [stdout] [31m✗ Error: Failed to reject question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1A[1G[J[31m✗ Error: Failed to reject question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...test app::recording::tests::test_try_handle_approval_question_reject_removes_item_and_returns_true ... ok
[INFO] [stdout] test app::recording::tests::test_handle_toggle_ignores_transcribing_state ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_empty_queue_returns_false ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_all_patterns ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_allow_all ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_always ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_always_allow ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_case_insensitive ... ok
[INFO] [stdout] [31m✗ Error: Failed to reply to question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1Atest approval::matcher::tests::test_always_takes_priority_over_once ... [ok1G
[INFO] [stdout] [J[31m✗ Error: Failed to reply to question: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[31m✗ Error: Failed to reply to permission: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...[1A[1G[J[31m✗ Error: Failed to reply to permission: Cannot connect to OpenCode at http://localhost:4096. Make sure OpenCode is running with --port flag: opencode --port <port>[0m
[INFO] [stdout]   Recovering...test approval::matcher::tests::test_always_trust ... ok
[INFO] [stdout] test approval::matcher::tests::test_always_trust_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_empty ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_random_text ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_question_match_removes_item_and_returns_true ... ok
[INFO] [stdout] test approval::matcher::tests::test_no_match_whitespace_only ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_internal_punctuation_preserved ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_extra_whitespace ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_mixed_case ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_multiple_trailing_punctuation ... ok
[INFO] [stdout] test approval::matcher::tests::test_not_allowed_exact_reject ... ok
[INFO] [stdout] test approval::matcher::tests::test_normalize_punctuation ... ok
[INFO] [stdout] [35m⚠ Approval needed: bash — [0m
[INFO] [stdout]   Say: allow/always/rejecttest approval::matcher::tests::test_once_all_patterns ... ok
[INFO] [stdout] test app::recording::tests::test_try_handle_approval_permission_match_removes_item_and_returns_true ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_accept ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_this ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_once ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_approve_this ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_execute ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_go_ahead ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_do_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_ok ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_okay ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_permit ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_go_for_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_proceed ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_run_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_sure ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_with_punctuation ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yep ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yeah ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_yes ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_custom_answer ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_custom_answer_preserves_text ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_empty_questions_no_match ... ok
[INFO] [stdout] test approval::matcher::tests::test_once_allow_once ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_exact_label_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_label_in_text ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_no_match_no_custom ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_1 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_2 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_option_3 ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_out_of_range_no_custom ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_out_of_range_with_custom ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_first ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_one ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_second ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_numeric_word_two ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_cancel ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_dismiss ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_nevermind ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_exact_label ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_never_mind ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_skip ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_all_patterns ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_block ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_cancel ... ok
[INFO] [stdout] test approval::matcher::tests::test_question_reject_none ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_decline ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_deny ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_do_not ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dont ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dont_do_it ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_nah ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_no ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_case_insensitive ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_dismiss ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_nope ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_refuse ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_skip ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_stop ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_reject ... ok
[INFO] [stdout] test app::recording::tests::test_return_to_approval_pending_when_queue_has_items ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_deny_prefix ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_no_space_separator ... ok
[INFO] [stdout] test approval::queue::tests::test_add_permission_and_peek ... ok
[INFO] [stdout] test approval::queue::tests::test_add_question_and_peek ... ok
[INFO] [stdout] [33m⠋ Transcribing...[0mtest approval::queue::tests::test_clear_on_empty_queue ... ok
[INFO] [stdout] test approval::queue::tests::test_clear_then_reuse ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message ... ok
[INFO] [stdout] test approval::queue::tests::test_default_creates_empty_queue ... ok
[INFO] [stdout] test approval::queue::tests::test_fifo_ordering ... ok
[INFO] [stdout] test approval::queue::tests::test_has_pending_tracks_state ... ok
[INFO] [stdout] test approval::queue::tests::test_insertion_order_preserved ... ok
[INFO] [stdout] test approval::queue::tests::test_len_increments_correctly ... ok
[INFO] [stdout] test approval::queue::tests::test_new_queue_is_empty ... ok
[INFO] [stdout] test approval::queue::tests::test_peek_does_not_remove ... ok
[INFO] [stdout] test approval::matcher::tests::test_reject_with_message_cancel_prefix ... ok
[INFO] [stdout] test approval::queue::tests::test_mixed_permission_and_question_types ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_last_item_leaves_empty ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_middle_item ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_not_found ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_preserves_fifo_order ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_not_found_does_not_change_len ... ok
[INFO] [stdout] test audio::wav::tests::test_create_temp_wav_path_has_uuid ... ok
[INFO] [stdout] test audio::wav::tests::test_create_temp_wav_path_in_temp_dir ... ok
[INFO] [stdout] test audio::wav::tests::test_drop_no_panic_when_file_missing ... ok
[INFO] [stdout] test audio::wav::tests::test_write_and_delete ... ok
[INFO] [stdout] test bridge::events::tests::test_backoff_calculation ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_connected ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_empty_data ... ok
[INFO] [stdout] test app::recording::tests::test_handle_toggle_recording_to_transcribing ... ok
[INFO] [stdout] test audio::wav::tests::test_write_wav_creates_valid_file ... ok
[INFO] [stdout] test approval::queue::tests::test_clear_empties_queue ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_heartbeat_ignored ... ok
[INFO] [stdout] test approval::queue::tests::test_remove_found ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_session_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_message_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_missing_properties ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_ignored_misc_events_return_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_permission_replied ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_rejected ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_permission_asked ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_no_type_field ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_busy ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_idle ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_asked ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_question_replied ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_malformed_json ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_missing_status_field ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_snake_case_session_id ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_truly_unknown_event_returns_none ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_session_status_retry ... ok
[INFO] [stdout] test bridge::events::tests::test_parse_unknown_type ... ok
[INFO] [stdout] test config::tests::test_app_config_default_field_values ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_contains_app_name ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_is_absolute ... ok
[INFO] [stdout] test config::tests::test_model_size_display ... ok
[INFO] [stdout] test config::tests::test_model_size_display_small_en ... ok
[INFO] [stdout] test config::tests::test_model_size_display_tiny_en ... ok
[INFO] [stdout] test config::tests::test_model_size_from_str ... ok
[INFO] [stdout] test config::tests::test_get_data_dir_ends_with_opencode_voice ... ok
[INFO] [stdout] test config::tests::test_model_size_default ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_base ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_small ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_roundtrip_tiny ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_short_aliases_are_multilingual ... ok
[INFO] [stdout] test config::tests::test_model_size_fromstr_unknown_returns_error ... ok
[INFO] [stdout] test config::tests::test_model_size_is_multilingual ... ok
[INFO] [stdout] test config::tests::test_app_config_opencode_port ... ok
[INFO] [stdout] test config::tests::test_model_size_from_str_invalid ... ok
[INFO] [stdout] test config::tests::test_model_size_display_base_en ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_alias_right_alt ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_key_map_has_60_plus_entries ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_caps_lock ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_decimal_number ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_escape ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_f13 ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_hex_number ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_left_command ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_modifiers ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_numpad ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_right_option ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_f13 ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_numpad_enter ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_space ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_f1 ... ok
[INFO] [stdout] test input::hotkey::platform::tests::test_resolve_key_unknown ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_right_option ... ok
[INFO] [stdout] test input::hotkey::tests::test_key_map_has_60_plus_entries ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_includes_numpad_clear ... ok
[INFO] [stdout] test tests::test_get_data_dir_contains_app_name ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_sorted ... ok
[INFO] [stdout] test tests::test_format_key_name_via_main ... ok
[INFO] [stdout] test tests::test_list_key_names_non_empty ... ok
[INFO] [stdout] test tests::test_model_size_display_in_main ... ok
[INFO] [stdout] test transcribe::engine::tests::test_is_model_valid_nonexistent ... ok
[INFO] [stdout] test input::hotkey::tests::test_list_key_names_includes_section ... ok
[INFO] [stdout] test input::hotkey::tests::test_format_key_name_space ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_blank_audio ... ok
[INFO] [stdout] test transcribe::engine::tests::test_is_model_valid_small_file ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_mixed ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_preserves_non_timestamp_brackets ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_with_arrow ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_timestamps_no_timestamps ... ok
[INFO] [stdout] test transcribe::setup::tests::test_get_model_path ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_case_insensitive ... ok
[INFO] [stdout] test transcribe::setup::tests::test_get_model_path_contains_model_size ... ok
[INFO] [stdout] test transcribe::engine::tests::test_strip_hallucinations_preserves_real_text ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_missing_file ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_small_file ... ok
[INFO] [stdout] test ui::display::tests::test_all_states_produce_distinct_output ... ok
[INFO] [stdout] test transcribe::setup::tests::test_is_whisper_ready_valid_file ... ok
[INFO] [stdout] test tests::test_list_devices_does_not_panic ... ok
[INFO] [stdout] test ui::display::tests::test_all_states_produce_output ... ok
[INFO] [stdout] test ui::display::tests::test_display_default ... ok
[INFO] [stdout] test ui::display::tests::test_display_new_initial_state ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_bash ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_edit ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_write ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_clamps_above_one ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_empty ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_full ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_half ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_multiple_count ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_no_approval ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_empty_metadata ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_read ... ok
[INFO] [stdout] test ui::display::tests::test_format_permission_detail_unknown_fallback ... ok
[INFO] [stdout] test ui::display::tests::test_render_level_width_zero ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_question ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_question_empty ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_error_default_message ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_no_transcript ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_transcript_truncated ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_recording ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_idle_with_transcript ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_recording_no_level ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_transcribing ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_injecting ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_error ... ok
[INFO] [stdout] test ui::display::tests::test_render_state_approval_pending_permission ... ok
[INFO] [stdout] [32m● Ready [Space] — Press to speak[0mtest app::recording::tests::test_return_to_idle_when_no_pending ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_not_shutting_down ... ok
[INFO] [stdout] test app::tests::test_voice_app_event_channel_works ... ok
[INFO] [stdout] test app::tests::test_recover_from_error_transitions_to_idle ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_approval_queue_empty ... ok
[INFO] [stdout] [31m✗ Error: test error[0m
[INFO] [stdout]   Recovering...test app::tests::test_handle_error_sets_error_state ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_initializes_idle_state ... ok
[INFO] [stdout] test app::tests::test_voice_app_new_whisper_none_when_model_missing ... ok
[INFO] [stderr]      Running tests/bridge_test.rs (/opt/rustwide/target/debug/deps/bridge_test-bb893201be462b16)
[INFO] [stdout] test app::tests::test_voice_app_shutdown_idempotent ... ok
[INFO] [stdout] test app::tests::test_voice_app_shutdown_cancels_token ... ok
[INFO] [stdout] test app::tests::test_voice_app_shutdown_sets_flag ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 258 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.08s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 11 tests
[INFO] [stdout] test test_no_auth_header_when_no_password ... ok
[INFO] [stdout] test test_reply_permission_sends_correct_request ... ok
[INFO] [stdout] test test_reject_question_sends_correct_request ... ok
[INFO] [stdout] test test_auth_header_sent_when_password_set ... ok
[INFO] [stdout] test test_reply_permission_always_with_message ... ok
[INFO] [stdout] test test_get_base_url ... ok
[INFO] [stdout] test test_get_base_url_trailing_slash_stripped ... ok
[INFO] [stdout] test test_append_prompt_with_query_params ... ok
[INFO] [stdout] test test_append_prompt_sends_correct_request ... ok
[INFO] [stdout] test test_is_connected_returns_true_when_server_running ... ok
[INFO] [stdout] test test_is_connected_returns_false_when_server_not_running ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 11 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.99s
[INFO] [stdout] 
[INFO] [stderr]      Running tests/sse_test.rs (/opt/rustwide/target/debug/deps/sse_test-8a9131707c203e60)
[INFO] [stdout] 
[INFO] [stdout] running 16 tests
[INFO] [stdout] test test_backoff_doubles_and_caps_at_30s ... ok
[INFO] [stdout] test test_backoff_cap_is_exactly_30s ... ok
[INFO] [stdout] test test_blank_data_value_is_skipped ... ok
[INFO] [stdout] test test_backoff_individual_steps ... ok
[INFO] [stdout] test test_empty_data_line_is_skipped ... ok
[INFO] [stdout] test test_heartbeat_produces_no_event ... ok
[INFO] [stdout] test test_missing_type_field_is_ignored ... ok
[INFO] [stdout] test test_multiline_sse_block_finds_data_line ... ok
[INFO] [stdout] test test_permission_replied_parses_correctly ... ok
[INFO] [stdout] test test_permission_asked_parses_correctly ... ok
[INFO] [stdout] test test_question_asked_parses_correctly ... ok
[INFO] [stdout] test test_question_replied_parses_correctly ... ok
[INFO] [stdout] test test_question_rejected_parses_correctly ... ok
[INFO] [stdout] test test_malformed_json_is_skipped ... ok
[INFO] [stderr]    Doc-tests opencode_voice
[INFO] [stdout] test test_server_connected_parses_correctly ... ok
[INFO] [stdout] test test_unknown_event_type_is_ignored ... ok
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] running 0 tests
[INFO] [stdout] 
[INFO] [stdout] test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
[INFO] [stdout] 
[INFO] running `Command { std: "docker" "inspect" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10", kill_on_drop: false }`
[INFO] [stdout] 62def5f82f306105a3cb948684f20059d49d081731af145e22045e4d7130da10
